package com.css.fxfzaqbz.util;

import java.io.File;
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.util.Iterator;  
import java.util.List;  

import org.apache.commons.io.IOUtils;  
import org.docx4j.jaxb.Context;  
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.exceptions.InvalidFormatException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.PartName;  
import org.docx4j.openpackaging.parts.WordprocessingML.AlternativeFormatInputPart;  
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;  
import org.docx4j.relationships.Relationship;  
import org.docx4j.wml.CTAltChunk;

/**
 * @author y1fan
 * @create 2023-6-29 19:40
 * 合并docx文件流的工具类
 */
public class DocxUtil {

    public static InputStream mergeDocx(final List<InputStream> streams) throws Docx4JException,IOException{
        WordprocessingMLPackage target=null;
        final File generated=File.createTempFile("generated",".docx");
        int chunkId=0;
        Iterator<InputStream> it=streams.iterator();
        while (it.hasNext()){
            InputStream is =it.next();
            if (is!=null){
                if (target==null){
                    OutputStream os=new FileOutputStream(generated);
                    os.write(IOUtils.toByteArray(is));
                    os.close();
                    target=WordprocessingMLPackage.load(generated);
                }else {
                    insertDocx(target.getMainDocumentPart(),IOUtils.toByteArray(is),chunkId++);
                }
            }
        }
        if (target!=null){
            target.save(generated);
            return new FileInputStream(generated);
        }else {
            return null;
        }
    }

    private static void insertDocx(MainDocumentPart main, byte[] bytes, int chunkId) {
        try {
            AlternativeFormatInputPart afiPart=new AlternativeFormatInputPart(
                    new PartName("/part"+chunkId+".docx"));
            afiPart.setBinaryData(bytes);
            Relationship altChunkRel=main.addTargetPart(afiPart);
            CTAltChunk chunk=Context.getWmlObjectFactory().createCTAltChunk();
            chunk.setId(altChunkRel.getId());
            main.addObject(chunk);
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        }
    }

}



